#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

const int mod = 1000000007;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);  // 优化输入输出

    int n;
    cin >> n;
    vector<int> l(n), r(n);
    int min_h = 10000, max_h = 0;

    // 读取数据并确定值域范围
    for (int i = 0; i < n; i++) {
        cin >> l[i] >> r[i];
        min_h = min(min_h, l[i]);  // 全局最小左边界
        max_h = max(max_h, r[i]);  // 全局最大右边界
    }

    long long ans = 0;

    // 枚举所有可能的序列最大值h
    for (int h = min_h; h <= max_h; h++) {
        long long prodA = 1;  // 存储A(h)：所有元素≤h的序列权值和
        long long prodB = 1;  // 存储B(h)：所有元素≤h-1的序列权值和

        // 遍历每个位置
        for (int i = 0; i < n; i++) {
            // 计算S_i(h)：a_i在[l_i, min(r_i,h)]区间内，(h - a_i + 1)的和
            int R1 = min(r[i], h);
            long long s1 = 0;
            if (R1 >= l[i]) {
                int len = R1 - l[i] + 1;                    // 项数
                long long first = h - l[i] + 1;             // 首项
                long long last = h - R1 + 1;                // 末项
                s1 = (first + last) * len / 2;             // 等差数列求和
            }

            // 计算T_i(h)：a_i在[l_i, min(r_i,h-1)]区间内，(h - a_i + 1)的和
            int R2 = min(r[i], h - 1);
            long long s2 = 0;
            if (R2 >= l[i]) {
                int len = R2 - l[i] + 1;                    // 项数
                long long first = h - l[i] + 1;             // 首项
                long long last = h - R2 + 1;                // 末项
                s2 = (first + last) * len / 2;             // 等差数列求和
            }

            // 累乘结果（每一步取模防溢出）
            prodA = (prodA * (s1 % mod)) % mod;
            prodB = (prodB * (s2 % mod)) % mod;
        }

        // 容斥计算最大值恰好为h的序列权值和
        long long F = (prodA - prodB + mod) % mod;  // 防止负数
        ans = (ans + F) % mod;  // 累加到总答案
    }

    cout << ans << endl;
    return 0;
}
